package com.example;

import java.io.*;

public class FileStreamTest {

    public static void main(String[] args) {
        testFileOutputStream();
        testFileOutputStreamString();
    }

    // 文件输出流 会乱码
    public static void testFileOutputStream() {
        try {
            // byte bWrite[] = {11, 21, 3, 40, 5};
            String c = "中文";
            // 创建文件输出流
            OutputStream os = new FileOutputStream("test.txt");
            // for (int x = 0; x < bWrite.length; x++) {
            //     // 写入字节
            //     os.write(bWrite[x]); // writes the bytes
            // }
            // 报错 因为FileOutputStream 是字节流，不能直接写入字符串
            // os.write(c);

            // 将字符串转换为字节数组
            os.write(c.getBytes());
            os.close();

            // 创建文件输入流
            InputStream is = new FileInputStream("test.txt");
            int size = is.available();
            System.out.println("文件大小为: " + size + " 字节" + "\t");
            // 读取字节
            for (int i = 0; i < size; i++) {
                // 为什么什么都读不出来？
                System.out.print(is.read() + " ~~~~~~~~~~~~ ");
            }
            is.close();
        } catch (IOException e) {
            System.out.print("Exception");
        }
    }

    public static void testFileOutputStreamString() {
        try {
            // 构建输出流
            FileOutputStream fop = new FileOutputStream("a.txt");
            // 构建FileOutputStream对象
            // ,文件不存在会自动新建
            // 构建OutputStreamWriter对象,参数可以指定编码,默认为操作系统默认编码,windows上是gbk
            OutputStreamWriter writer = new OutputStreamWriter(fop, "UTF-8");
            // 构建OutputStreamWriter对象,参数可以指定编码,默认为操作系统默认编码,windows上是gbk

            // 写入到缓冲区 
            writer.append("中文输入");
            // 换行
            writer.append("\r\n");
            // 写入到缓冲区
            writer.append("English");
            // 刷新缓存冲,写入到文件,如果下面已经没有写入的内容了,直接close也会写入

            writer.close();
            // 关闭写入流,同时会把缓冲区内容写入文件,所以上面的注释掉

            fop.close();
            // 关闭输出流,释放系统资源

            // 构建输入流 字节流
            FileInputStream fip = new FileInputStream("a.txt");
            // 构建FileInputStream对象

            // 构建输入流 字符流
            InputStreamReader reader = new InputStreamReader(fip, "UTF-8");
            // 构建InputStreamReader对象,编码与写入相同

            // 读取字符流
            StringBuffer sb = new StringBuffer();
            while (reader.ready()) {
                sb.append((char) reader.read());
                // 转成char加到StringBuffer对象中
            }
            System.out.println(sb.toString());
            reader.close();
            // 关闭读取流

            fip.close();
            // 关闭输入流,释放系统资源
        } catch (IOException e) {
            System.out.print("Exception");

        }

    }
}
